package com.baomidou.springmvc.common.redis;

import java.util.List;
import java.util.Map;
import java.util.Set;

import com.baomidou.springmvc.common.utils.PropertiesUtils;

import redis.clients.jedis.Jedis;

public class RedisUtil {
	
	//初始化连接数据库索引
	static{
		RedisTemplate redisTemplate = new RedisTemplate(RedisPool.getJedisPool());
		String value = redisTemplate.execute(new RedisCallback<String>() {
			@Override
			public String handle(Jedis jedis) {
				// TODO Auto-generated method stub
				int index = Integer.parseInt(PropertiesUtils.getString("config.properties", "redis_select", null));
				return jedis.select(index);
			}
		});
	}
	/**
	 * 根据key存放一个对象
	 * @description 
	 * @author hewei
	 * @title: putMap
	 * @date 2017年7月13日 下午4:53:33
	 * @param key
	 * @param map
	 * @return String
	 */
	public static String putObject(final String key ,final Map<String,String> map){
		RedisTemplate redisTemplate = new RedisTemplate(RedisPool.getJedisPool());
		String value = redisTemplate.execute(new RedisCallback<String>() {
			@Override
			public String handle(Jedis jedis) {
				// TODO Auto-generated method stub
				return jedis.hmset(key, map);
			}
		});
		return value;
	}
	/**
	 * 获取一个或者多个属性的值,多个以逗号分隔
	 * @description 
	 * @author hewei
	 * @title: getMorePro
	 * @date 2017年7月13日 下午5:11:06
	 * @param key
	 * @param p1
	 * @param p2
	 * @return String
	 */
	public static String getMorePro(final String key,final String p1,final String p2){
		RedisTemplate redisTemplate = new RedisTemplate(RedisPool.getJedisPool());
		String value = redisTemplate.execute(new RedisCallback<String>() {
			@Override
			public String handle(Jedis jedis) {
				if((null != p1 && p1.length() > 0) && (null != p2 && p2.length() > 0)){
					List<String> list = jedis.hmget(key, p1, p2);
					return list.get(0)+","+list.get(1);
				}else{
					if(null != p1 && p1.length() > 0){
						return jedis.hget(key, p1);
					}else  if(null != p2 && p2.length() > 0){
						return jedis.hget(key, p2);
					}else{
						return "failed";
					}

				}

			}
		});
		return value;
	}

	/**
	 * 增加或者减少一个属性的值
	 * @description 
	 * @author hewei
	 * @title: incr
	 * @date 2017年7月13日 下午5:45:28
	 * @param key
	 * @param p1
	 * @param score
	 * @param flag
	 * @return String
	 */
	public static String incr(final String key,final String p1,final long score,final String flag){
		RedisTemplate redisTemplate = new RedisTemplate(RedisPool.getJedisPool());
		String value = redisTemplate.execute(new RedisCallback<String>() {
			@Override
			public String handle(Jedis jedis) {
				if("+".equals(flag)){
					return jedis.hincrBy(key, p1, score).toString();
				}else{
					if(score > Long.parseLong(jedis.hget(key, p1))){
						return "failed";
					}else{
						int s = Integer.parseInt(jedis.hget(key, p1));
						return jedis.hset(key, p1, (s - score)+"").toString();
					}
				}

			}
		});
		return value;
	}

	/**
	 * 判断某个属性的某个值是否存在
	 * @description 
	 * @author hewei
	 * @title: isExist
	 * @date 2017年7月14日 下午2:46:00
	 * @param key
	 * @param val
	 * @return String
	 */
	public static String isExist(final String key,final String val){
		RedisTemplate redisTemplate = new RedisTemplate(RedisPool.getJedisPool());
		String value = redisTemplate.execute(new RedisCallback<String>() {
			@Override
			public String handle(Jedis jedis) {
				Set<String> keySet = jedis.keys("*");
				for(String set : keySet){
					if(getMorePro(set,key,null).equals(val)){
						return "exist";
					}
				}
				return "not exist";

			}
		});
		return value;
	}
	
	/**
	 * 根据电话号码获取用户的ID，添加灵魂伴侣时使用
	 * @description 
	 * @author hewei
	 * @title: getIdByPhone
	 * @date 2017年7月18日 下午5:11:02
	 * @param key
	 * @param val
	 * @return String
	 */
	public static String getIdByPhone(final String key,final String val){
		RedisTemplate redisTemplate = new RedisTemplate(RedisPool.getJedisPool());
		String value = redisTemplate.execute(new RedisCallback<String>() {
			@Override
			public String handle(Jedis jedis) {
				Set<String> keySet = jedis.keys("*");
				for(String set : keySet){
					if(getMorePro(set,key,null).equals(val)){
						return jedis.hget(set, "id");
					}
				}
				return "failed";

			}
		});
		return value;
	}
	/**
	 * 判断某个键是否存在
	 * @description 
	 * @author hewei
	 * @title: keyExist
	 * @date 2017年7月14日 下午3:00:44
	 * @param key
	 * @return String
	 */
	public static String keyExist(final String key){
		RedisTemplate redisTemplate = new RedisTemplate(RedisPool.getJedisPool());
		String value = redisTemplate.execute(new RedisCallback<String>() {
			
			@Override
			public String handle(Jedis jedis) {
				if(jedis.exists(key)) return "exist";
				return "not exist";
			}
		});
		return value;
	}
	
	/**
	 * 存储微信的session并且设置过期时间
	 * @description 
	 * @author hewei
	 * @title: save3rdSession
	 * @date 2017年9月28日 下午2:13:35
	 * @param key
	 * @param val
	 * @return String
	 */
	public static String save3rdSession(final String key,final String val){
		RedisTemplate redisTemplate = new RedisTemplate(RedisPool.getJedisPool());
		String value = redisTemplate.execute(new RedisCallback<String>() {
			
			@Override
			public String handle(Jedis jedis) {
				return jedis.set(key, val, "NX", "EX", 7200);
			}
		});
		return value;
	}
	
	public static String getProByKey(final String key){
		RedisTemplate redisTemplate = new RedisTemplate(RedisPool.getJedisPool());
		String value = redisTemplate.execute(new RedisCallback<String>() {
			
			@Override
			public String handle(Jedis jedis) {
				return jedis.get(key);
			}
		});
		return value;
	}
	
	/**
	 * 存储暂时变量
	 * @description 
	 * @author hewei
	 * @title: saveTempVar
	 * @date 2017年10月26日 下午3:01:01
	 * @param key
	 * @param val
	 * @param expireTime
	 * @return String
	 */
	public static String saveTempVar(final String key,final String val,final int expireTime){
		RedisTemplate redisTemplate = new RedisTemplate(RedisPool.getJedisPool());
		String value = redisTemplate.execute(new RedisCallback<String>() {
			
			@Override
			public String handle(Jedis jedis) {
				return jedis.set(key+val, val, "NX", "EX", expireTime);
			}
		});
		return value;
	}
	public static void main(String[] args) {
		System.out.println(getIdByPhone("phone","15330035337"));;
	}
}
